package weixinOperator

import (
	"fmt"
	"github.com/astaxie/beego"
	//"亚太-iot-服务器/models"
	//"github.com/astaxie/beego/config"
	//"github.com/astaxie/beego/utils"
	"gopkg.in/chanxuehong/wechat.v2/mp/message/template"
	"strconv"
	"t11Lib/t11Errors"
	"t11Lib/t11Log"
	"t11Lib/t11Util"
	"time"
)

var isSendTemplateMsg = func() bool {
	ret := beego.AppConfig.DefaultBool("isSendTemplateMsg", true)
	if !ret {
		t11Log.Debug("！！！当前配置将不会推送微信消息！！！")
	}
	return ret
}()

//为了加快返回速度，通知微信用户的步骤放在其他routine中执行
var sendWxNotifyMsgChan chan *template.TemplateMessage2 = func() chan *template.TemplateMessage2 {
	ch := make(chan *template.TemplateMessage2, 1000)
	//20个goroutine共享1000的缓冲区
	for i := 0; i < 50; i++ {
		go func() {
			for {
				msg := <-ch
				appId := "wxdac90ea64e64dcfc"
				wechatClient, _ := MpManager.WechatClient(appId)
				if _, err := template.Send(wechatClient, msg); err != nil {
					t11Log.Debuglnf("发送微信通知消息失败, msg = %+v, err = %v", msg, err)
				}
			}
		}()
	}
	return ch
}()

//发送模板消息
func (self *templateMsgSender) doSendTemplateMsg(url, templateId string, wxOpenId string, params map[string]template.DataItem) t11Errors.T11Error {
	if !isSendTemplateMsg {
		return nil
	}
	msg := &template.TemplateMessage2{}
	msg.ToUser = wxOpenId
	msg.TemplateId = templateId
	msg.Data = params
	if url != "" {
		msg.URL = url
	}
	sendWxNotifyMsgChan <- msg
	return nil
}

func (self *templateMsgSender) sendTemplateMsg(tmplateId, wxOpenId, first, remark string, keywords ...string) t11Errors.T11Error {

	params := make(map[string]template.DataItem)
	params["first"] = template.DataItem{Value: first}
	params["remark"] = template.DataItem{Value: remark}
	cnt := len(keywords)
	for i := 0; i < cnt; i++ {
		key := "keyword" + strconv.FormatInt(int64(i+1), 10)
		params[key] = template.DataItem{Value: keywords[i]}
	}
	return self.doSendTemplateMsg("", tmplateId, wxOpenId, params)
}

func (self *templateMsgSender) sendTemplateMsgWithUrl(url, tmplateId, wxOpenId, first, remark string, keywords ...string) t11Errors.T11Error {
	params := make(map[string]template.DataItem)
	params["first"] = template.DataItem{Value: first}
	params["remark"] = template.DataItem{Value: remark}
	cnt := len(keywords)
	for i := 0; i < cnt; i++ {
		key := "keyword" + strconv.FormatInt(int64(i+1), 10)
		params[key] = template.DataItem{Value: keywords[i]}
	}
	return self.doSendTemplateMsg(url, tmplateId, wxOpenId, params)
}

type templateMsgSender struct {
	templateMsgIdOpenDoor      string //开门消息
	templateMsgIdAlarm         string //报警信息
	templateMsgIdUserRegister  string //用户注册
	templateMsgIdDelUser       string //用户删除
	templateMsgIdBindDoor      string //门锁绑定
	templateMsgIdBindGateway   string //网关绑定
	templateMsgIdUnbindGateway string //网关解绑
	templateMsgIdReqRandKey    string //请求临时密码授权
	templateMsgIdReqRandKey2   string //请求临时密码授权2
	templateMsgIdModifyPasswd  string //修改密码提醒
}

var TemplateMsg templateMsgSender = templateMsgSender{}

func init() {
	templateMsgIdOpenDoor := beego.AppConfig.String("templateMsgIdOpenDoor")
	if templateMsgIdOpenDoor == "" {
		panic("templateMsgIdOpenDoor未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdOpenDoor = templateMsgIdOpenDoor
	templateMsgIdAlarm := beego.AppConfig.String("templateMsgIdAlarm")
	if templateMsgIdAlarm == "" {
		panic("templateMsgIdAlarm未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdAlarm = templateMsgIdAlarm
	templateMsgIdUserRegister := beego.AppConfig.String("templateMsgIdUserRegister")
	if templateMsgIdUserRegister == "" {
		panic("templateMsgIdUserRegister未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdUserRegister = templateMsgIdUserRegister
	templateMsgIdDelUser := beego.AppConfig.String("templateMsgIdDelUser")
	if templateMsgIdDelUser == "" {
		panic("templateMsgIdDelUser未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdDelUser = templateMsgIdDelUser
	templateMsgIdBindDoor := beego.AppConfig.String("templateMsgIdBindDoor")
	if "" == templateMsgIdBindDoor {
		panic("templateMsgIdBindDoor未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdBindDoor = templateMsgIdBindDoor
	templateMsgIdBindGateway := beego.AppConfig.String("templateMsgIdBindGateway")
	if "" == templateMsgIdBindGateway {
		panic("templateMsgIdBindGateway未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdBindGateway = templateMsgIdBindGateway
	templateMsgIdUnbindGateway := beego.AppConfig.String("templateMsgIdUnbindGateway")
	if "" == templateMsgIdUnbindGateway {
		panic("templateMsgIdUnbindGateway未配置，请正确配置")
	}
	templateMsgIdReqRandKey := beego.AppConfig.String("templateMsgIdReqRandKey")
	templateMsgIdReqRandKey2 := beego.AppConfig.String("templateMsgIdReqRandKey2")
	if "" == templateMsgIdReqRandKey && templateMsgIdReqRandKey2 == "" {
		panic("templateMsgIdReqRandKey,templateMsgIdReqRandKey2未配置，请正确配置")
	}
	TemplateMsg.templateMsgIdReqRandKey = templateMsgIdReqRandKey
	TemplateMsg.templateMsgIdUnbindGateway = templateMsgIdUnbindGateway
	TemplateMsg.templateMsgIdReqRandKey2 = templateMsgIdReqRandKey2

	//修改密码
	TemplateMsg.templateMsgIdModifyPasswd = beego.AppConfig.String("templateMsgIdModifyPasswd")

	//TemplateMsg.TestUnit()
}

//{{first.DATA}}
//报警类型：{{keyword1.DATA}}
//报警设备：{{keyword2.DATA}}
//报警时间：{{keyword3.DATA}}
//{{remark.DATA}}
//尊敬的用户，你的大狗发生警报
//报警类型：入侵警报
//报警设备：门磁探头
//报警时间：2015年8月20日
//请及时处理
//发送报警信息
func (self *templateMsgSender) SendAlarmMsg(wxOpenId, alarmType, devName string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdAlarm, wxOpenId,
		"尊敬的用户，您的门锁有一条信息", "请及时处理",
		alarmType, devName, time.Now().Format("2006年01月02日 15:04"))
}

//{{first.DATA}}
//申请人手机号：{{keyword1.DATA}}
//申请时间：{{keyword2.DATA}}
//{{remark.DATA}}
//在发送时，需要将内容中的参数（{{.DATA}}内为参数）赋值替换为需要的信息
//内容示例
//您好，您有一个临时密码授权请求。
//申请人手机号：18665643402
//申请时间：2017年7月5日 16:59:13
//详情请进入公众号内查看
func (self *templateMsgSender) SendTmpKeyReqMsg(wxOpenId, phoneNumber string, randKey []byte) t11Errors.T11Error {
	host := beego.AppConfig.String("host")
	proto := "http"
	if beego.AppConfig.DefaultBool("t11UseHttps", false) {
		proto = "https"
	}
	dstUrl := fmt.Sprintf(proto+"://%s/wx/wxdevice/sendMsg?phoneNumber=%s&randKey=%s", host, phoneNumber, t11Util.BytesToHexStringWithoutSpace(randKey))
	t11Log.Debug("dstUrl = ", dstUrl)
	if self.templateMsgIdReqRandKey2 == "" {
		return self.sendTemplateMsgWithUrl(dstUrl, self.templateMsgIdReqRandKey, wxOpenId, "您好，您有一条临时密码授权请求", "详情请进入公众号内查看", phoneNumber, time.Now().Format("2006年01月02日 15:04"))
	} else {
		return self.sendTemplateMsgWithUrl(dstUrl, self.templateMsgIdReqRandKey2, wxOpenId, "您好，您有一条临时密码授权请求", "详情请进入公众号内查看", time.Now().Format("2006年01月02日 15:04"), "现场申请")
	}
}

func (self *templateMsgSender) SendOpenDoorMsg(wxOpenId, lockUserName, lockName, keyType string) t11Errors.T11Error {
	if keyType == "临时授权" {
		//临时授权用户开门
		return self.sendTemplateMsg(self.templateMsgIdOpenDoor, wxOpenId,
			"您好，您有一条开门通知", "详情请进入公众号内查看",
			"临时授权用户", lockName, keyType, time.Now().Format("2006年01月02日 15:04"))
	}
	return self.sendTemplateMsg(self.templateMsgIdOpenDoor, wxOpenId,
		"您好，您有一条开门通知", "详情请进入公众号内查看",
		lockUserName, lockName, keyType, time.Now().Format("2006年01月02日 15:04"))
}

//#用户注册
//{{first.DATA}}
//用户编码：{{keyword1.DATA}}
//用户类型：{{keyword2.DATA}}
//注册时间：{{keyword3.DATA}}
//{{remark.DATA}}
//templateMsgIdUserRegister = cyiy7Oh7b012_gcXae2QLqyY_xWVD-EGsa2pTE3JHzs
func (self *templateMsgSender) SendUserRegistermsg(wxOpenId, userId, userType string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdUserRegister, wxOpenId,
		"您好，锁端用户注册成功", "详情请进入公众号内查看",
		userId, userType, time.Now().Format("2006年01月02日 15:04"))
}

//#用户删除
//{{first.DATA}}
//用户ID：{{keyword1.DATA}}
//用户类型：{{keyword2.DATA}}
//删除时间：{{keyword3.DATA}}
//{{remark.DATA}}
//templateMsgIdDelUser = 3AfHI2JsWuwSy_beXJa_DQa_CbOqr4N74Fk1_7k60xI
func (self *templateMsgSender) SendUserDeleteMsg(wxOpenId, userId, userType string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdDelUser, wxOpenId,
		"您好，用户删除成功", "详情请进入公众号内查看",
		userId, userType, time.Now().Format("2006年01月02日 15:04"))
}

//#门锁绑定
//{{first.DATA}}
//绑定结果：{{keyword1.DATA}}
//绑定时间：{{keyword2.DATA}}
//{{remark.DATA}}
//templateMsgIdBindDoor = pCHwbdI_ROzaOBOU_3wO3gWkbIDGKfD7oT6ZZvSoDVQ
func (self *templateMsgSender) SendLockBindSuccessMsg(wxOpenId string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdBindDoor, wxOpenId,
		"您好，您有一条门锁绑定消息", "详情请进入公众号内查看",
		"绑定成功", time.Now().Format("2006年01月02日 15:04"))
}

//#网关绑定
//{{first.DATA}}
//绑定结果：{{keyword1.DATA}}
//绑定时间：{{keyword2.DATA}}
//{{remark.DATA}}
//templateMsgIdBindGateway = pCHwbdI_ROzaOBOU_3wO3gWkbIDGKfD7oT6ZZvSoDVQ
func (self *templateMsgSender) SendGatewayBindMsg(wxOpenid string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdBindGateway, wxOpenid,
		"您好，您有一条网关绑定消息", "详情请进入公众号内查看",
		"绑定成功", time.Now().Format("2006年01月02日 15:04"))
}

//#网关解绑
//{{first.DATA}}
//设备状态：{{keyword1.DATA}}
//时间：{{keyword2.DATA}}
//{{remark.DATA}}
//templateMsgIdUnbindGateway = uU-hcc1BPEhcFhkb1n0a1H7JzMqAkfstp727GLrIuQY
func (self *templateMsgSender) SendGatewayUnbindMsg(wxOpenId string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdUnbindGateway, wxOpenId,
		"您好，您的网关已经解除绑定", "详情请进入公众号内查看",
		"解绑成功", time.Now().Format("2006年01月02日 15:04"))
}

//修改密码
//#{{first.DATA}}
//#用户名：{{keyword1.DATA}}
//#修改时间：{{keyword2.DATA}}
//#{{remark.DATA}}
func (self *templateMsgSender) SendModifyPasswdMsg(wxOpenId string, lockUserName string) t11Errors.T11Error {
	return self.sendTemplateMsg(self.templateMsgIdModifyPasswd, wxOpenId,
		"您好，您的门锁密码被修改了", "详情请进入公众号内查看",
		lockUserName, time.Now().Format("2006年01月02日 15:04"))
}

func (self *templateMsgSender) TestUnit() {

	openId := "oJOuUjl--WyvGHon5dT24iXeAuFg"
	deviceNane := "chan"
	//randKey := []byte{'c','h','a','n'}

	_ = self.SendAlarmMsg(openId, "电量低", deviceNane)
	//_ = self.SendTmpKeyReqMsg(openId, "18665643402", randKey) // 暂时未添加该功能
	_ = self.SendOpenDoorMsg(openId, "liang", deviceNane, "管理员")
	_ = self.SendUserRegistermsg(openId, "01", "管理员")
	_ = self.SendUserDeleteMsg(openId, "01", "管理员")
	_ = self.SendLockBindSuccessMsg(openId)
	_ = self.SendGatewayBindMsg(openId)
	_ = self.SendGatewayUnbindMsg(openId)
	_ = self.SendModifyPasswdMsg(openId, deviceNane)
}

